package main

import "fmt"

/**
Go语言数组的声明

数组的写法如下：
	var 数组变量名 [元素数量]T

其中：
	数组变量名：数组声明及使用时的变量名。
	元素数量：数组的元素数量。可以是一个表达式，但最终通过编译期计算的结果必须是整型数值。也就是说，元素数量不能含有到运行时才能确认大小的数值。
	T：可以是任意基本类型，包括 T 为数组本身。类型为数组本身时，可以实现多维数组。

数组的每个元素都可以通过索引下标来访问，索引下标的范围是从 0 开始到数组长度减 1 的位置。内置的 len 函数将返回数组中元素的个数。
*/
func main() {

	var a [3]int             // 定义三个整数的数组
	fmt.Println(a[0])        // 打印第一个元素
	fmt.Println(a[len(a)-1]) // 打印最后一个元素

	// 打印索引和元素
	for i, v := range a {
		fmt.Printf("%d %d\n", i, v)
	}

	// 仅打印元素
	for _, v := range a {
		fmt.Printf("%d\n", v)
	}

	// 默认情况下，数组的每个元素都被初始化为元素类型对应的零值，对于数字类型来说就是 0。
	// 同时也可以使用数组字面值语法用一组值来初始化数组：
	var b = [3]int{1, 2}
	for key, value := range b {
		fmt.Printf("%d %d\n", key, value)
	}

	// 在数组字面值中，如果在数组的长度位置出现的是“...”省略号，则表示数组的长度是根据初始化值的个数来计算。
	// 因此，上面 q 数组的定义可以简化为：
	q := [...]int{1, 2, 3}
	fmt.Printf("%T\n", q) // "[3]int"

	// 数组的长度是数组类型的一个组成部分，因此 [3]int 和 [4]int 是两种不同的数组类型。数组的长度必须是常量表达式，
	// 因为数组的长度需要在编译阶段确定。
	q := [3]int{1, 2, 3}
	//q = [4]int{1, 2, 3, 4} // 编译错误：无法将 [4]int 赋给 [3]int

}
